from dataclasses import dataclass
from typing import Tuple, List


@dataclass
class VideoConfig:
    """视频相关配置"""
    size: Tuple[int, int] = (720, 1280)
    default_fps: int = 24
    segment_fps: int = 12
    

@dataclass
class SubtitleConfig:
    """字幕相关配置"""
    max_chars_per_line: int = 30
    max_lines: int = 2
    min_duration: float = 1.0
    max_duration: float = 5.0
    font_size: int = 11
    stroke_width: int = 3
    margin_bottom: int = 20
    margin_horizontal: int = 20
    embed_to_video: bool =  False
    hardcode_to_video: bool = True
    
    @property
    def max_chars_per_segment(self) -> int:
        return self.max_chars_per_line * self.max_lines


@dataclass
class LLMConfig:
    """LLM API相关配置"""
    base_url: str = "https://ark.cn-beijing.volces.com/api/v3"
    model: str = "deepseek-v3-250324"
    temperature: float = 0.2
    max_tokens: int = 1024
    system_prompt: str = """<role>豆包生图prompt生成专家</role>

<instruction>
  根据用户提供的小说段落内容，深入分析其中的场景、人物、氛围和视觉元素，生成高质量的豆包生图模型prompt，确保生成的图像能准确贴合小说内容的意境和细节。

  重要：确保图像的一致性，包括：
  1. 人物外观一致性（相同角色在不同场景中保持相同的外貌特征）
  2. 艺术风格一致性（整个故事保持统一的视觉风格）
  3. 世界观一致性（环境、建筑、物品符合设定的世界观）
  4. 色彩基调一致性（整体色彩氛围保持协调）
</instruction>

<guidelines>
  - 仔细阅读并理解小说段落的核心场景和情感基调
  - 提取关键视觉元素，包括人物外貌、服装、环境、天气、光线等
  - 识别并保留小说中的重要细节和特色元素
  - 使用豆包生图模型易于理解的描述性语言
  - 合理控制prompt长度，突出最重要的视觉信息
  - 考虑画面构图和视角，选择最能表现小说内容的角度
  - 保持与原文氛围和风格的一致性
  - 避免过于抽象的概念，专注于具体可视化的元素
  - 必要时添加艺术风格指导，如"电影级画质"、"细腻光影"等
</guidelines>

<workflow>
  1. 深入分析小说段落，理解场景背景、人物描述和情感氛围
  2. 识别并列出所有可视化的关键元素（人物、环境、道具、天气等）
  3. 确定最适合的画面构图和视角
  4. 将文学描述转换为图像生成的专业术语
  5. 构建完整的豆包生图prompt，包含主体、环境、风格等要素
  6. 检查prompt的完整性和可执行性，确保能生成贴合原文的图像
  7. 图片风格必须是游戏 第五人格 漫画画风，不要出现其他风格
</workflow>

<output_format>
  - 提供完整的豆包生图prompt，用引号标明
</output_format>

<examples>
  <example>
    <user_query>
      "夕阳西下，古老的石桥上站着一位白衣女子，她的长发在晚风中轻舞，远山如黛，桥下流水潺潺，几只归鸟掠过天际，整个画面透着一种淡淡的忧伤。"
    </user_query>
    
    <assistant_response>
      prompt:
      游戏 第五人格 漫画画风，夕阳黄昏，古老石拱桥上站立一位白衣长裙女子，长发飘逸在晚风中，背景远山青黛色，桥下清澈流水，天空中飞鸟剪影，暖色调夕阳光线，唯美忧郁氛围，中国风古典意境，电影级画质，细腻光影效果

    </assistant_response>
  </example>
</examples>"""


@dataclass
class ImageGenConfig:
    """图片生成API相关配置"""
    base_url: str = "https://ark.cn-beijing.volces.com/api/v3"
    model: str = "doubao-seedream-3-0-t2i-250415"
    size: str = "720x1280"
    response_format: str = "url"


@dataclass
class TTSConfig:
    """TTS API相关配置"""
    api_url: str = "http://47.90.179.219:8501/tts_url"
    default_voice_type: str = "英文_男声_磁性硬朗"
    voice_mapping: dict = None
    
    def __post_init__(self):
        if self.voice_mapping is None:
            self.voice_mapping = {
                "英文_男声_磁性硬朗": "/app/audio_prompts/磁性硬朗-男声.MP3",
                "中文_男声_张震": "/app/audio_prompts/张震-男-旁白.wav"
            }


@dataclass
class ProcessingConfig:
    """处理相关配置"""
    max_concurrent_workers: int = 20
    animation_effects: List[str] = None
    
    def __post_init__(self):
        if self.animation_effects is None:
            # self.animation_effects = ["ken_burns", "zoom_in", "zoom_out", "slide_left", "slide_right"]
            self.animation_effects = ["zoom_in", "zoom_out"]


@dataclass
class AppConfig:
    """应用全局配置"""
    video: VideoConfig = None
    subtitle: SubtitleConfig = None
    processing: ProcessingConfig = None
    llm: LLMConfig = None
    image_gen: ImageGenConfig = None
    tts: TTSConfig = None
    
    def __post_init__(self):
        if self.video is None:
            self.video = VideoConfig()
        if self.subtitle is None:
            self.subtitle = SubtitleConfig()
        if self.processing is None:
            self.processing = ProcessingConfig()
        if self.llm is None:
            self.llm = LLMConfig()
        if self.image_gen is None:
            self.image_gen = ImageGenConfig()
        if self.tts is None:
            self.tts = TTSConfig()


# 全局配置实例
config = AppConfig()